#ifndef EVOLUTION_INDIVIDUAL_HH
#define EVOLUTION_INDIVIDUAL_HH

#include "genome.hh"
#include <memory>

namespace evolution {

    class Individual {
        std::shared_ptr<Genome> genome;

    public:
        Individual (std::shared_ptr<Genome> genome) : genome(genome) { }

        float genetic_distance (Individual const* other) const;
        std::shared_ptr<Genome> get_genome() const { return genome; }    

        virtual float calculate_fitness() = 0;
        virtual float get_fitness() const = 0;    
        virtual std::shared_ptr<Individual> mate (Individual const* other) const = 0;
        virtual std::shared_ptr<Individual> clone () const = 0;
        virtual std::shared_ptr<Individual> twin () const = 0;
        virtual ~Individual() = 0;
    };

}

#endif
